package com.utils;


import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils {

//    private static String driver=null;
//    private static String url=null;
//    private static String username=null;
//    private static String password=null;
//
//    static {
//
//        try {
//            //读取jdbc.properties属性配置文件
//            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//            Properties properties=new Properties();
//            //从流中加载数据
//            properties.load(in);
//
//            driver = properties.getProperty("driver");
//            url= properties.getProperty("url");
//            username = properties.getProperty("username");
//            password = properties.getProperty("password");
//
//            Class.forName(driver);
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 获取数据库的连接
//     * @return
//     * @throws SQLException
//     */
//    public static Connection getConnection() throws SQLException {
//        return DriverManager.getConnection(url,username,password);
//    }
//
//    /**
//     * 关闭连接
//     * @param conn
//     * @param st
//     * @param rs
//     */
//    public static void release(Connection conn, Statement st, ResultSet rs){
//        if(conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//        if(rs!=null){
//            try {
//                rs.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//
//        if(st!=null){
//            try {
//                st.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }


    private static ThreadLocal<Connection> conns=new ThreadLocal<Connection>();

    private static String driver=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;

    static {

        try {
            //读取jdbc.properties属性配置文件
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties properties=new Properties();
            //从流中加载数据
            properties.load(in);

            driver = properties.getProperty("driver");
            url= properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");

            Class.forName(driver);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库的连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        //后面继续调用getConnection()时，就能确保都是同一个Connection对象
        Connection conn=conns.get();

        //第一次调用getConnection()
        if(conn==null){
            try {
                conn=DriverManager.getConnection(url,username,password);
                conns.set(conn);// 保存到 ThreadLocal 对象中，供后面的 jdbc 操作使用
                conn.setAutoCommit(false);// 设置为手动管理事务
            }catch (SQLException e){
                e.printStackTrace();
            }

        }
        return conn;

//   原本：     return DriverManager.getConnection(url,username,password);
    }
    /*** 提交事务，并关闭释放连接 */
    public static void commitAndClose(){
        Connection connection = conns.get();
        if(connection!=null){    // 如果不等于 null，说明 之前使用过连接，操作过数据库
            try {
                connection.commit();  // 提交 事务
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    connection.close();    // 关闭连接，资源资源
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        // 一定要执行 remove 操作，否则就会出错。（因为 Tomcat 服务器底层使用了线程池技术）
        conns.remove();

    }
    /*** 回滚事务，并关闭释放连接 */
    public static void rollBackAndClose(){
        Connection connection = conns.get();
        if(connection!=null){    // 如果不等于 null，说明 之前使用过连接，操作过数据库
            try {
                connection.rollback();  // 回滚 事务
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    connection.close();    // 关闭连接，资源资源
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        // 一定要执行 remove 操作，否则就会出错。（因为 Tomcat 服务器底层使用了线程池技术）
        conns.remove();

    }


    /**
     * 关闭连接
     * @param conn
     * @param st
     * @param rs

    public static void release(Connection conn, Statement st, ResultSet rs){
    if(conn!=null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if(rs!=null){
    try {
    rs.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }

    if(st!=null){
    try {
    st.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
     */

}
